package Fp

import (
	"database/sql"
	"db2s/full"
	"db2s/parDef"
	"sync/atomic"
	"time"
)

const (
	LoopThreshold = 10
)

type valueLocationInput struct {
	k        int64
	ws       []string
	wc       []string
	Segment  int
	nullMark map[int]int
	indexCol  []string
	//	LastModifyPoint int64 //记录上一次联合索引的变化的索引列序号，用于判断是否进行拆分
	firstLineMap map[string]int
}
type ConnDb struct {
	SourceObject string
	DestObject   string
	Sdb          map[string]*sql.DB `json:"sdb"` //源端连接
	Ddb          map[string]*sql.DB `json:"ddb"` //目端连接
}
type TableObject struct {
	Schema           string `json:"schema"`  //库名
	MSchema          string `json:"mSchema"` //映射后的库名端表名
	Table            string `json:"table"`   //表名
	MTable           string `json:"mTable"`  //映射后的目标端表名
	PartitionName    string `json:"partitionName"`
	ShardName        string `json:"shardName"`
	BackendTableName string `json:"backendTableName"`
	RowsLimit        int    //限制取多少行数据
}
type StaticParameter struct {
	CpLength        int           `json:"cpLength"`   //数据缓存管道长度
	TableLimit      int64         `json:"tableLimit"` //
	MulFactor       *int64        //倍数因子
	ChunkNumber     int64         `json:"chunkNumber"` //单个chunk的大小，一个块包含多少行
	Scn             string        `json:"scn"`
	SqlExecStopTime time.Duration `json:"sqlExecStopTime"`
	SqlMode         bool          `json:"sqlMode"`
	QueryFilter     string        `json:"queryFilter"`
	Extreme         bool          `json:"extreme"` //当为true时忽略限速，达到迁移的性能极致
}
type RunValue struct {
	Name                *atomic.Value //[]string 索引列名
	Type                *atomic.Value //[]string  索引列的数据类型
	Null                *atomic.Value //map[int]int  //索引列的null值约束
	Batch               parDef.IndexPart
	WS                  *atomic.Value //当前值的前一个索引列值
	WC                  *atomic.Value //当前索引列值
	SwsMd5              *atomic.Value //string md5值
	ErrorStr            *atomic.Value //error //错误信息
	BreakMd5            *atomic.Value //死循环判断的md5hash 值
	LoopFrequency       *int64        //死循环的次数
	LastModifyPoint     int
	SegmentCompareValue []int
	FirstSemLogSeq      *int64
	Result              chan any
}
type TaskDistribution struct {
	LogSeq       int64  `json:"logSeq"`     //日志线程号
	DataSource   string `json:"DataSource"` //设置chunk start数据的来源
	TableObject  TableObject
	Full         full.Full
	Parameter    []parDef.Parameter
	SrcParameter parDef.Parameter
	DstParameter parDef.Parameter
	Object       parDef.Object
	StaticP      StaticParameter
	First        RunValue
	Second       RunValue
	ErrEnd       *int64
}
type whereLeft struct {
	swsLeft  []map[string]string
	swsRight []map[string]string
}
type whereRight struct {
	pLeft      []map[string]string
	pRight     []map[string]string
	Segment    int
	compareSeq int64  //输出范围中间值最后值的序号
	NullBool   *int32 //二级分段是否需要判断null值
}
type swsValueResult struct {
	left  []map[string]string
	right []map[string]string
}
type inputConditionalS struct {
	CompareSeq *int64
	full full.Full
	Name *atomic.Value
	Type *atomic.Value
	Null *atomic.Value
	WS   *atomic.Value
	WC   *atomic.Value
}
